package com.zenithmind.library.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.domain.BorrowRecord;
import com.zenithmind.library.pojo.dto.BorrowBookDTO;
import com.zenithmind.library.pojo.dto.ReturnBookDTO;
import com.zenithmind.library.pojo.dto.RenewBookDTO;
import com.zenithmind.library.pojo.query.BorrowRecordQuery;
import com.zenithmind.library.pojo.vo.BorrowRecordVO;
import com.zenithmind.library.pojo.vo.BorrowStatisticsVO;

import java.time.LocalDate;
import java.util.List;

/**
 * 借阅服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface BorrowService extends IService<BorrowRecord> {

    /**
     * 借阅图书
     * 
     * @param borrowDTO 借阅信息
     * @return 借阅结果
     */
    Result<BorrowRecordVO> borrowBook(BorrowBookDTO borrowDTO);

    /**
     * 归还图书
     * 
     * @param returnDTO 归还信息
     * @return 归还结果
     */
    Result<BorrowRecordVO> returnBook(ReturnBookDTO returnDTO);

    /**
     * 续借图书
     * 
     * @param renewDTO 续借信息
     * @return 续借结果
     */
    Result<BorrowRecordVO> renewBook(RenewBookDTO renewDTO);

    /**
     * 分页查询借阅记录
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BorrowRecordVO> getBorrowRecordPage(BorrowRecordQuery query);

    /**
     * 根据用户ID查询借阅记录
     * 
     * @param userId 用户ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BorrowRecordVO> getBorrowRecordsByUser(String userId, BorrowRecordQuery query);

    /**
     * 根据图书ID查询借阅记录
     * 
     * @param bookId 图书ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BorrowRecordVO> getBorrowRecordsByBook(String bookId, BorrowRecordQuery query);

    /**
     * 获取用户当前借阅的图书
     * 
     * @param userId 用户ID
     * @return 借阅记录列表
     */
    List<BorrowRecordVO> getCurrentBorrowsByUser(String userId);

    /**
     * 获取逾期借阅记录
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BorrowRecordVO> getOverdueBorrows(BorrowRecordQuery query);

    /**
     * 获取即将到期的借阅记录
     * 
     * @param days 天数
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BorrowRecordVO> getDueSoonBorrows(Integer days, BorrowRecordQuery query);

    /**
     * 检查用户是否可以借阅
     * 
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 检查结果
     */
    Result<Boolean> canUserBorrow(String userId, String bookId);

    /**
     * 检查图书是否可以借阅
     * 
     * @param bookId 图书ID
     * @return 检查结果
     */
    Result<Boolean> canBookBeBorrowed(String bookId);

    /**
     * 计算罚金
     * 
     * @param borrowRecordId 借阅记录ID
     * @return 罚金金额
     */
    Result<Double> calculateFine(String borrowRecordId);

    /**
     * 支付罚金
     * 
     * @param borrowRecordId 借阅记录ID
     * @param amount 支付金额
     * @return 支付结果
     */
    Result<Void> payFine(String borrowRecordId, Double amount);

    /**
     * 发送到期提醒
     * 
     * @param borrowRecordId 借阅记录ID
     * @return 发送结果
     */
    Result<Void> sendDueReminder(String borrowRecordId);

    /**
     * 批量发送到期提醒
     * 
     * @param days 提前天数
     * @return 发送结果
     */
    Result<Integer> batchSendDueReminders(Integer days);

    /**
     * 获取借阅统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    BorrowStatisticsVO getBorrowStatistics(LocalDate startDate, LocalDate endDate);

    /**
     * 获取用户借阅统计
     * 
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    BorrowStatisticsVO getUserBorrowStatistics(String userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取图书借阅统计
     * 
     * @param bookId 图书ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    BorrowStatisticsVO getBookBorrowStatistics(String bookId, LocalDate startDate, LocalDate endDate);

    /**
     * 导出借阅记录
     * 
     * @param query 查询条件
     * @return 导出文件路径
     */
    Result<String> exportBorrowRecords(BorrowRecordQuery query);

    /**
     * 自动处理逾期记录
     * 
     * @return 处理结果
     */
    Result<Integer> autoProcessOverdueRecords();
}
